package modelos.daos;

import controladores.ManejadorBaseDatos;
import modelos.pojos.Reserva;
import java.sql.*;
import java.util.*;

public class ReservaDAO {

    private static Connection con;
    public static List<Reserva> resultados;

    public static void crear(Reserva reserva, int idCliente) throws SQLException, Exception {

        ManejadorBaseDatos mbd = ManejadorBaseDatos.getInstancia();
        mbd.conectar();
        con = mbd.getConexion();

        if (con == null) {
            throw new SQLException("Ha ocurrido un error al intentar conectarse con la base de datos");
        }

        PreparedStatement pst = null;

        try {
            pst = con.prepareStatement("Insert Into Reserva values(?,?,?,?,?,?)");
            pst.setString(1, null);
            pst.setInt(2, idCliente);
            pst.setString(3, reserva.getCodigoReserva());
            pst.setString(4, reserva.getDescripcion());
            pst.setTimestamp(5, new Timestamp(reserva.getFechaRealizacion().getTime()));
            pst.setString(6, reserva.getEstado() + "");
            pst.executeUpdate();


        } finally {

            if (pst != null) {
                pst.close();
            }
        }
    }

    public static Reserva consultar(String codigo) throws SQLException {

        ResultSet rs = null;
        PreparedStatement pst = null;
        Reserva reserva = null;

        try {
            ManejadorBaseDatos mbd = ManejadorBaseDatos.getInstancia();
            mbd.conectar();
            con = mbd.getConexion();
            pst = con.prepareStatement("select Reserva.*,Cliente.cedula from Reserva,Cliente where codigoReserva = ? and Reserva.idCliente=Cliente.id");
            pst.setString(1, codigo);
            rs = pst.executeQuery();
            while (rs.next()) {
                reserva = Reserva.cargarDatos(rs);
            }
        } finally {
            if (rs != null) {
                rs.close();
            }
            return reserva;
        }
    }

        public static List listarPorCliente(String cedula) throws SQLException {

        ResultSet rs = null;
        PreparedStatement pst = null;
        resultados = new LinkedList<Reserva>();

        try {
            ManejadorBaseDatos mbd = ManejadorBaseDatos.getInstancia();
            mbd.conectar();
            con = mbd.getConexion();
            pst = con.prepareStatement("select Reserva.*,Cliente.cedula from Reserva,Cliente where idCliente = ? and Reserva.idCliente=Cliente.id");
            pst.setInt(1, ClienteDAO.consultar(cedula).getId());
            rs = pst.executeQuery();

            while (rs.next()) {
                resultados.add(Reserva.cargarDatos(rs));
            }
        } finally {
            if (rs != null) {
                rs.close();
            }
            return resultados;
        }
    }

    public static List listar(String codigo) throws SQLException {

        ResultSet rs = null;
        PreparedStatement pst = null;
        resultados = new LinkedList<Reserva>();

        try {
            ManejadorBaseDatos mbd = ManejadorBaseDatos.getInstancia();
            mbd.conectar();
            con = mbd.getConexion();
            pst = con.prepareStatement("Select Reserva.*,Cliente.cedula from Paula.Reserva inner join Paula.Cliente where Reserva.idCliente = Cliente.id and codigoReserva like ?");
            pst.setString(1, "%"+codigo+"%");
            rs = pst.executeQuery();

            while (rs.next()) {
                resultados.add(Reserva.cargarDatos(rs));
            }
        } finally {
            if (rs != null) {
                rs.close();
            }
            return resultados;
        }
    }

    public static void actualizar(Reserva reserva) throws SQLException, Exception {
        int id = reserva.getId();
        PreparedStatement pst = null;

        try {
            ManejadorBaseDatos mbd = ManejadorBaseDatos.getInstancia();
            mbd.conectar();
            con = mbd.getConexion();
            pst = con.prepareStatement("Update Reserva Set descripcion=?,estado=? Where id=?");
            pst.setString(1, reserva.getDescripcion());
            pst.setString(2, reserva.getEstado()+"");
            pst.setInt(3, id);
            pst.executeUpdate();

        } finally {
            if (pst != null) {
                pst.close();
            }
        }

    }

    public static void eliminar(String codigo) throws SQLException, Exception {
        if (consultar(codigo) == null) {
            throw new SQLException("");
        }
        PreparedStatement pst = null;

        try {
            ManejadorBaseDatos mbd = ManejadorBaseDatos.getInstancia();
            mbd.conectar();
            con = mbd.getConexion();
            pst = con.prepareStatement("delete from Reserva where codigo = ?");
            pst.setString(1, codigo);
            pst.executeUpdate();

        } finally {
            if (pst != null) {
                pst.close();
            }
        }

    }

    public static void cancelar(String codigo) throws SQLException, Exception {
        if (consultar(codigo) == null) {
            throw new SQLException("");
        }
        PreparedStatement pst = null;

        try {
            ManejadorBaseDatos mbd = ManejadorBaseDatos.getInstancia();
            mbd.conectar();
            con = mbd.getConexion();
            pst = con.prepareStatement("update Reserva a, ReservaSala b, ReservaHabitacion c set a.estado='i', b.estado='i',c.estado='i' where a.id=? and b.idReserva=c.idReserva;");
            int id = ReservaDAO.consultar(codigo).getId();
            pst.setInt(1, id);
            pst.executeUpdate();

        } finally {
            if (pst != null) {
                pst.close();
            }
        }

    }
}
